由於我這次的 Auth 功能相關實作後端會使用 Node.js 來進行開發,所以在進行這次的 Auth 相關實作前,我們先來看看 Node.js 的注意事項以及相關的安全實踐吧 ~
這個部分會分為兩個部分做講解,第一個部分是使用第三方 libraries,而第二個部分則會講解其他程式碼需要注意的實踐部分~
因為目前在 Node.js 中,任何套件都可以存取強大的資源
,例如:網路存取。
此外,由於它們還可以存取檔案系統,因此它們可以將任何資料發送到任何地方
。
所有運行在 node process 中的程式碼都能通過使用 eval()
來載入和執行其他任意程式碼。
所有具有文件系統寫入權限
(write access) 的程式碼都可以通過寫入加載的新文件或現有文件
來實現相同的目的。
策略機制
策略的重點是首先防止惡意程式碼完全載入到應用程式中,而最佳實踐是確保策略清單對於正在運行的 Node.js 應用程式是唯讀的
,並且該檔案不能被正在運行的 Node.js 應用程式以任何方式更改。
透過此方式,可以藉此聲明該加載的資源是不是不受信任的
。
以下介紹幾個範例,如有需要可以查看原文件 (https://nodejs.org/api/permissions.html#policies)
使用範例介紹:
使用 --experimental-policy
flag 可用於在載入模組時啟用原則功能。
設定後,所有模組都必須符合傳遞給該標誌的策略清單檔案 (policy.json
):
node --experimental-policy=policy.json app.js
策略清單將用於對 Node.js 載入的程式碼實施約束。
為了減少對磁碟上策略檔案的竄改,可以透過 --policy-integrity
提供策略檔案本身的完整性。即使檔案在磁碟上發生更改,這也允許運行節點並斷言策略檔案內容。
node --experimental-policy=policy.json --policy-integrity="sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0" app.js
完整性檢查:
策略檔案必須使用子資源完整性字串的完整性檢查,該字串與絕對 URL 關聯的瀏覽器完整性屬性
相容。
為什麼需要檢查?
Node.js 會使用 Modules All Together 的方法(https://nodejs.org/api/modules.html#all-together) 加載模塊,而當我們使用require()
來加載模塊時,會以以下方式取得資料。
請看以下範例,假設我們有以下的檔案目錄結構:
app/
server.js
checked.js
checked
若我們在 server.js
中使用 require('./checked')
,依據 Modules All Together
的方法,他會載入 checked
。
完整性檢查的使用方式:
當使用 require()
或 import
時,如果開發者已指定策略清單,則會檢查載入中涉及的所有資源的完整性。
如果資源與清單中列出的完整性不匹配,則會拋出錯誤。
允許載入檔案checked.js
的範例 policy.json
:
{
"resources": {
"./app/checked.js": {
"integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
},
"./app/server.js": {
"dependencies": {
"./checked": "./app/checked.js"
},
"integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqaa0xnpCxYlqMBufKZHAHQM4/boDaI/0"
},
}
}
接著,我們再啟用策略機制:
node --experimental-policy=policy.json app/server.js
由於 Github 原始程式碼並不總是與已發布的原始程式碼相同,請在 node_modules 中驗證它。
可以使用 npm ci
來替換 npm install
:
因為這會強制執行 loackfile,並且會將原有 node module 給刪除,執行比較 clean 的 install,避免與 package.json 文件之間不同而產生的衝突。
將 npm audit
導入 ci 中:
npm audit
可以幫忙檢查漏洞。
最近心情稍微混亂一些,原本中秋節應該好好的在家裡把所有想做的事情完成,但突然身體不舒服躺了一天QQ
還好到今天晚餐吃烤肉前有恢復精力QQ (可能是烤肉之神眷顧我吧
明天一定要好好把剩下的安全實踐完成才行~ 完成後就是我最期待的安全實作的研究啦! Fighting!
Node.js best practices:
https://nodejs.org/zh-tw/docs/guides/security
OSSF Best practices:
https://github.com/ossf/wg-best-practices-os-developers